Skip to content

feat(deep-scan): Deep Scan Runtime Service Foundation#44

Merged
selimmujdeci merged 2 commits into
mainfrom
feat/deep-scan-runtime-service
Jul 10, 2026
Merged

feat(deep-scan): Deep Scan Runtime Service Foundation#44
selimmujdeci merged 2 commits into
mainfrom
feat/deep-scan-runtime-service

Conversation

@selimmujdeci

Copy link
Copy Markdown
Owner

Amaç

Yeni araç ilk kez bağlandığında çalışacak Deep Scan sürecinin merkezi runtime foundation katmanı: durum · ilerleme · keşif sonuçları · olaylar · güvenli çalışma koşulları.

Bu PR gerçek tarama yapmaz. Araca tek bir sorgu bile göndermez. Native OBD, PID/DID formülü, SQL/Supabase, cloud, UI, SystemBoot wiring ve Assistant Context wiring kapsam dışı.

main'den bağımsız branch — PR #43'e bağımlı değil, diff temiz.

Yeni dosyalar

  • src/platform/deepScan/deepScanModel.ts — saf tipler, sabitler, kurallar
  • src/platform/deepScan/deepScanRuntimeService.ts — durum makinesi
  • src/platform/deepScan/index.ts — barrel
  • src/__tests__/deepScanRuntimeService.test.ts — 57 test

Değişen dosyalar

Başka hiçbir dosyaya dokunulmadı.

⚠️ Bilinen eksik kaynak: gerçek ignition sinyali YOK

Repo denetiminde kontak/ACC durumunu yayan gerçek bir kaynak bulunamadı:

  • obdDiagnosticTypes.IGNITION_OFF yalnız bir mesaj sabiti — kod tabanında hiçbir yerde emit edilmiyor.
  • commandExecutor.ignitionOn çağırandan gelen bir parametre, kaynak değil.

Bu yüzden kontak formülü uydurulmadı. ignitionConfirmed üç durumlu: true · false · null (bilinmiyor). Yalnız setIgnitionConfirmed() ile dışarıdan beslenir — servis kontağı asla tahmin etmez.

Durum modeli

idle · waiting_for_ignition · preparing · scanning · analyzing · completed · paused · cancelled · failed

completed/cancelled/failed terminaldir — mutasyon kabul etmez, reset() gerekir.

Faz modeli — AKTİF / OFFLINE ayrımı

Sınıf Fazlar Kontak gerekir mi
AKTİF (araca sorgu gönderir) vehicle_identity · protocol_detection · ecu_discovery · standard_pid_discovery · manufacturer_did_discovery · firmware_inventory Evet — yalnız ignitionConfirmed === true
OFFLINE (yerel analiz) capability_analysis · fingerprint_update · knowledge_update · evidence_update · change_detection · report_generation Hayır

vehicle_identity (Mode 09 VIN sorgusu) ve firmware_inventory (DID sorgusu) araca istek gönderdiği için aktif sayıldı.

Kritik fazlar: vehicle_identity, protocol_detection → hataları taramayı failed yapar. Diğer fazların hatası uyarıya çevrilir ve faz atlanır (fail-soft).

Kontak güvenliği (fail-closed)

ignitionConfirmed !== true olduğunda:

  • Aktif faza geçilemez → durum waiting_for_ignition, ignition_required olayı, faz değişmez, progress artmaz.
  • Aktif keşif kaydı (recordEcuDiscovery / recordPidDiscovery / recordDidDiscovery / recordFirmwareResult) reddedilir — kontak kapalıyken araca sorgu gitmiş sayılmaz.
  • Offline fazlar (analiz/rapor/change detection) çalışır.

Tarama sırasında kontak kaybedilirse (scanning/preparingfalse/null) durum otomatik waiting_for_ignition'a düşer. Duraklatılmış aktif faz, kontak yokken resumeScan() ile geri açılmaz.

null (bilinmiyor) kontak açık sayılmaz — bu PR'da aktif tarama otomatik başlatılmaz.

Full Scan / Change Check kararı

resolveScanMode(hasCompletedScanBefore)
  undefined | false → FULL_SCAN    (yeni / hiç tam taranmamış araç, isFirstScan=true)
  true              → CHANGE_CHECK (öğrenilmiş araç, isFirstScan=false)

Aynı araca her bağlantıda yeniden tam tarama yapılmaz. Kalıcı geçmiş deposu bu PR'ın kapsamı değilhasCompletedScanBefore çağırandan gelir; süreç yeniden başlayınca durum idle'a döner. Karar modeli ve alanlar hazır.

Event modeli

scan_started · ignition_required · phase_changed · progress_changed · ecu_discovered · pid_discovered · did_discovered · firmware_checked · change_detected · scan_paused · scan_resumed · scan_completed · scan_failed · scan_cancelled

Dinleyici kümesi bounded (32), Set semantiğiyle duplicate oluşmaz, bir dinleyicinin hatası yakalanır + warnings'e raporlanır ve servisi çökertmez (olay yeniden yayılmaz → sonsuz döngü yok). İterasyon kopya üstünde döner, böylece dinleyici içinde unsubscribe() çağrılırsa bozulmaz. Olay zarfı ve taşıdığı snapshot dondurulmuştur.

Progress modeli

Deterministik ve monotonik: [0,100] clamp (NaN/Infinity/sayı olmayan → 0), aynı veya geri fazda düşmez, faz değişiminde faz tabanına yükselir, completeScan() → 100, failScan()/cancelScan() mevcut değeri korur (sahte 100 yazılmaz). Faz içi ince ilerleme yalnız updateProgress() ile ölçülmüş değer olarak gelir — sahte ilerleme üretilmez.

Performans

Timer yok, abonelik yok, hot-path yok. Pasifken (tarama başlatılmamışken) yük sıfır — API çağrılmadıkça hiçbir kod çalışmaz, bu yüzden runtime scheduler'a görev de kaydedilmez. Tüm koleksiyonlar bounded: warnings 16 · listeners 32 · dedup anahtarları 4096. Yeni bağımlılık yok.

Gizlilik

Snapshot/rapor/olay zarfı Object.freeze'li. Ham VIN · MAC · koordinat · ham CAN frame · API key/secret giremez:

  • normalizeFingerprintHash() yalnız 8–64 hex kabul eder ve 17 karakterlik girdiyi (VIN uzunluğu) reddeder → VIN hash yerine geçirilemez.
  • ECU adresleri yalnız dedup anahtarı olarak bellekte tutulur; snapshot'a yalnız sayım olarak yansır.
  • Serbest metinler (warnings, errorCode, rapor notu) sanitizeText() ile VIN/MAC/koordinat/8+ hex/secret kalıplarını [redacted] yapar.

Assistant Context uyumu

Snapshot alanları PR #43'ün deepScan bölümüyle alan-uyumlu: completed (status) · progress (progressPercent) · newDiscoveriesCount · changedFirmware · changedEcu. useAssistantContextStore bu PR'da değiştirilmedi.

Foundation güvenceleri (testle kilitli)

  • deepScanRuntimeService.ts'in tek import'u ./deepScanModel — hiçbir OBD/discovery servisi import edilmiyor (kaynak-metin kilidi).
  • SystemBoot.ts kaynağında deepScan/DeepScan geçmiyor — wiring yok.
  • Tekil servis import sonrası idle, dinleyicisiz, dispose edilmemiş — yan etki yok.

Testler — 57 test

İstenen 30 senaryonun hepsi kapsandı: başlangıç idle (2) · FULL_SCAN/CHANGE_CHECK (3) · kontak güvenliği (10) · faz + progress (6) · keşif sayaçları + duplicate + değişiklik tespiti (8) · warnings bounded + fail-soft (3) · dinleyiciler (4) · yaşam döngüsü: start idempotent, cancel, pause/resume, reset, dispose (7) · immutability + girdi mutasyonsuzluğu (3) · gizlilik (6) · yan etki/wiring yok (5).

CI beklentisi

Yerel: tsc -b temiz · eslint temiz · 170 dosya / 2660 test yeşil (baseline 2603 + 57; regresyon yok).

Risk

Düşük. Tamamen yeni, izole bir modül; mevcut hiçbir çağrı yolu değişmedi. Servis import edilmediği ve API'si çağrılmadığı sürece etkisi sıfır. Araca sorgu gönderme yeteneği hiç yok — orchestration ayrı PR. Asıl risk o PR'da doğar: gerçek ignition kaynağı bulunana kadar aktif tarama otomatik tetiklenmemeli; bu servis fail-closed olduğu için kontak null iken aktif faz zaten açılmıyor.

Ledger

Kayıt #29 — 🔴 cihazda test edilmedi. Numara 29 seçildi çünkü 26/27/28 açık PR'larda rezerve (#41, #42, #43).

🤖 Generated with Claude Code

https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1

Yeni araç ilk kez bağlandığında çalışacak Deep Scan sürecinin merkezi runtime
FOUNDATION katmanı: durum · faz · ilerleme · keşif sayaçları · olaylar · güvenli
çalışma koşulları.

deepScanModel.ts (yeni, SAF): 9 durum + 12 faz + mod kararı + progress kuralları
+ gizlilik süzgeci. Servis import'u YOK, yan etki YOK.
  - ACTIVE_PHASES (araca sorgu: kimlik/protokol/ECU/PID/DID/firmware) ve
    OFFLINE_PHASES (analiz/fingerprint/knowledge/evidence/change/rapor) ayrımı.
  - resolveScanMode(): önceki tamamlanmış tarama yoksa FULL_SCAN, varsa
    CHANGE_CHECK (aynı araca her bağlantıda tam tarama YOK — vizyon kuralı).
  - normalizeFingerprintHash(): 8-64 hex; 17 karakter (VIN uzunluğu) REDDEDİLİR.
  - sanitizeText(): VIN/MAC/koordinat/ham hex/secret → [redacted].

deepScanRuntimeService.ts (yeni): saf durum makinesi. Araca TEK BİR sorgu bile
göndermez; hiçbir OBD/discovery/fingerprint/learning servisini import etmez
(kaynak-metin kilidi: tek import ./deepScanModel); timer/abonelik açmaz →
import edilmesi yan etki üretmez; SystemBoot'a BAĞLI DEĞİL (kilitli test).

KONTAK GÜVENLİĞİ (fail-closed): depoda kontak/ACC yayan GERÇEK kaynak YOK
(obdDiagnosticTypes.IGNITION_OFF yalnız bir mesaj sabiti — hiçbir yerde emit
edilmiyor). ignitionConfirmed üç durumlu (true/false/null=bilinmiyor), yalnız
setIgnitionConfirmed() ile dışarıdan beslenir — servis kontağı ASLA tahmin etmez.
true DEĞİLSE: aktif faz açılmaz, aktif keşif kaydı (ECU/PID/DID/firmware) kabul
edilmez, status waiting_for_ignition'da kalır; yalnız offline fazlar çalışır.
Tarama sırasında kontak kaybedilirse aktif durumdan düşülür.

Progress deterministik + monotonik: 0-100 clamp, geriye düşmez, faz tabanları,
complete→100, fail/cancel'da mevcut değer korunur. Sahte ilerleme üretilmez.

Fail-soft: kritik faz (kimlik/protokol) hatası → failed; kritik olmayan faz →
uyarı + atlanır. Dinleyici hatası yutulur+raporlanır, servisi çökertmez.
Bounded: warnings(16) · listeners(32, duplicate'siz) · dedup anahtarları(4096).

Gizlilik: snapshot/rapor/olay zarfı Object.freeze'li; ham VIN/MAC/koordinat/
CAN frame/API key giremez. ECU adresleri yalnız dedup anahtarı olarak bellekte,
snapshot'a yalnız SAYIM olarak yansır.

Assistant Context (PR #43) alan-uyumlu (completed/progress/newDiscoveriesCount/
changedFirmware/changedECU) ama useAssistantContextStore DEĞİŞTİRİLMEDİ; bu PR
#43'e BAĞIMLI DEĞİL (main'den bağımsız branch).

KAPSAM DIŞI: gerçek ECU taraması, native OBD, PID/DID formülü, SQL/Supabase,
cloud, UI, SystemBoot wiring, kalıcı tarama geçmişi.

Test: 57 test. tsc -b temiz, lint temiz, tam suite 2660 yeşil (regresyon yok).
Ledger #29 (cihazda test bekliyor).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
car-launcher-pro Ready Ready Preview, Comment Jul 10, 2026 7:34pm
carospro Ready Ready Preview, Comment Jul 10, 2026 7:34pm

…e-service

# Conflicts:
#	docs/DEVICE_VALIDATION_LEDGER.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant